/*
 * 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
 * 开发板官网：www.lckfb.com
 * 技术支持常驻论坛，任何技术问题欢迎随时交流学习
 * 立创论坛：https://oshwhub.com/forum
 * 关注bilibili账号：【立创开发板】，掌握我们的最新动态！
 * 不靠卖板赚钱，以培养中国工程师为己任
 * Change Logs:
 * Date           Author       Notes
 * 2024-03-26     LCKFB-LP    first version
 */
#include "main.h"
#include "stdio.h"
#include "flash_if.h"
#include "menu.h"
#if defined(__ARMCOMPILER_VERSION)
#include "cmsis_armclang.h"
#elif  defined(__CC_ARM)
// #include "cmsis_armcc.h"
#include "core_cm3.h"
#endif

// extern pFunction jump_to_application; // 用户应用程序入口函数指针
// extern uint32_t jump_address; // 用户应用程序起始地址

static void IAP_Init(void);

int main(void)
{
	// 初始化按键
	stm32_PBInit(BUTTON_TAMPER, BUTTON_MODE_GPIO);
	
	if (stm32_PBGetState(BUTTON_TAMPER) == 0x00)
	{
		IAP_Init();

		Main_Menu();
	}
	else
	{
		/* 保持程序运行 */
		/* 测试用户代码是否从 APPLICATION_ADDRESS 开始*/
		if (((*(__IO uint32_t*) APPLICATION_ADDRESS) & 0x2FFE0000) == 0x20000000)
		{
			jump_address = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
			jump_to_application = (pFunction) jump_address;

			/* 设置主栈指针 */
			__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);

			/* 跳转到用户应用程序 */
			jump_to_application();
		}
	}

	while (1)
	{
		/* 主循环 */
		/* 这里可以添加其他功能代码 */
	}
}

void IAP_Init(void)
{
	USART_InitTypeDef USART_InitStructure;

	FLASH_If_Init();
	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

	stm32_COMInit(COM1, &USART_InitStructure);
}
